const { PropertyModel } = require('../../models/index')

// 腾讯云存储相关服务
const COS = require('cos-nodejs-sdk-v5')
// 临时使用内存存储图片
const multer = require('multer')
const path = require('path');
const { Op } = require('sequelize');

// 生成随机ID
const { v4: uuidV4 } = require('uuid')

// 初始化 COS SDK  
const cos = new COS({
  SecretId: 'AKIDMxSo2GVoDi9UfeRfnjZCcpoV6f5Qc8Vf',
  SecretKey: '1oNipiMwX8dEakgOt9IWdWBdrrdBVP5X',
})

// 配置 multer 存储引擎，这里我们使用内存存储作为临时存储  
const storage = multer.memoryStorage();
const upload = multer({ storage: storage });

// 获取房源列表信息
const getPropertyList = async (req, res) => {
  try {
    // 获取页码和每页大小
    const { pageSize, page } = req.query

    // 确保页码和每页大小是有效的数字
    if (isNaN(parseInt(pageSize, 10)) || isNaN(parseInt(page, 10)) || pageSize < 0 || page < 0) {
      return res.status(400).json({ error: '无效的页码或每页大小' })
    }

    // 计算offset
    const offset = (parseInt(page, 10) - 1) * parseInt(pageSize, 10)

    const propertyList = await PropertyModel.findAndCountAll({
      attributes: ['id', 'title', 'address', 'room_count', 'livingroom_count', 'bathroom_count', 'room_area', 'price', 'image_url', 'decorate_type', 'rent_type', 'room_direction', 'is_hot'],
      order: [
        ['updatedAt', 'DESC'],
        ['createdAt', 'DESC']
      ],
      offset: offset,
      limit: parseInt(pageSize, 10)
    })

    res.status(200).json({
      title: '房源列表信息',
      propertyList: propertyList
    })

  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 获取房源详情信息
const getPropertyDetail = async (req, res) => {
  try {
    // 获取房源ID
    const id = req.params.id

    // 房源ID不存在的情况
    if (!id || isNaN(parseInt(id, 10))) {
      return res.status(400).json({ error: '无效的房源ID!' })
    }

    // 根据房源ID查找房源记录
    const propertyDetail = await PropertyModel.findByPk(id, {
      attributes: ['id', 'title', 'description', 'address', 'resident', 'county', 'city', 'province', 'longitude', 'latitude', 'room_count', 'livingroom_count', 'bathroom_count',
        'room_area', 'price', 'image_url', 'room_type', 'decorate_type', 'rent_type', 'floor', 'room_direction', 'bedroom_facility', 'public_facility', 'is_hot']
    })

    // 查找房源不存在的情况
    if (!propertyDetail) {
      return res.status(404).json({ error: '未匹配到房源信息！' })
    }

    // 查找房源成功
    res.status(200).json({
      title: '房源详情信息',
      data: propertyDetail
    })

  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 上传房源图片
const uploadImage = async (req, res) => {
  const Region = 'ap-beijing'

  try {
    // 封装multer的处理为一个Promise
    return new Promise((resolve, reject) => {
      // 使用 multer 的 single 方法处理名为 'file' 的文件上传字段  
      upload.single('file')(req, null, (err) => {
        if (err) {
          reject(err) //如果multer出错，直接拒绝Promise
        } else if (!req.file) {
          reject(new Error('没有选择文件上传')) //如果没有文件被上传，也需要拒绝Promise
        } else {
          resolve(req)  //如果成功，将req传递给下一个步骤
        }
      });
    }).then(async (req) => {

      // 区分上传的图片类型是室内图还是户型图
      const type = req.query.type
      // 文件信息  
      const file = req.file;

      // 使用UUID生成唯一的文件名
      const uuid = uuidV4()

      const originalExtension = path.extname(file.originalname)  //获取原始文件扩展名

      const fileNameWithUuid = `${uuid}${originalExtension}`; // 附加UUID到扩展名前
      console.log(fileNameWithUuid);

      const filePath = `room_detail/${type}/${fileNameWithUuid}`; // 设置存储桶中的文件路径

      // 使用 COS SDK 上传文件  
      try {
        const data = await new Promise((resolve, reject) => {
          cos.putObject({
            Bucket: 'lejuhui-1327374532', // 替换为你的存储桶名称和APPID  
            Region: Region, // 替换为你的存储桶所在地域  
            Key: filePath, // 存储桶中的文件路径  
            Body: file.buffer, // 文件内容  
          }, (err, data) => {
            if (err) {
              reject(err);
            } else {
              resolve(data);
            }
          });
        });

        // 上传成功  
        // 这里可以获取文件的URL，但通常你需要根据COS的访问域名和文件路径拼接  
        const fileUrl = `https://lejuhui-1327374532.cos.${Region}.myqcloud.com/${filePath}`;
        res.status(200).json({
          title: '上传图片成功',
          type: type,
          url: fileUrl
        })
      } catch (error) {
        // 捕获COS上传时的错误
        res.status(500).json({
          error: '上传图片失败',
          message: error.message || '服务器内部错误'
        })
      }
    });
  } catch (error) {
    // 捕获所有可能发生的错误  
    console.error('上传房源图片时发生错误:', error);
    res.status(500).json({ error: error.message });
  }
};


// 发布房源
const publishProperty = async (req, res) => {
  try {
    // 获取房源ID
    const id = req.body.id

    // 获取上传的房源数据
    const data = req.body

    // 如果房源ID存在则进行修改房源信息操作，否则就进行新建发布房源信息操作
    if (id) {
      const propertyItem = await PropertyModel.findByPk(id)

      // 未找到房源的情况
      if (!propertyItem) {
        return res.status(404).json({ error: '未找到需要修改的房源信息！' })
      }

      // 找到房源后修改信息
      const updateProperty = await propertyItem.update(data)

      // 返回修改成功的响应
      res.status(200).json({
        title: '修改房源信息成功',
        message: '已经成功修改房源信息',
        data: updateProperty.id
      })
    } else {
      const publishNewProperty = await PropertyModel.create(data)
      // 返回创建成功的响应
      res.status(200).json({
        title: '发布房源成功',
        message: "房源已经成功发布",
        data: publishNewProperty.id
      })

    }

  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 删除房源
const deleteProperty = async (req, res) => {
  try {
    // 获取房源ID
    const id = req.params.id

    const result = await PropertyModel.destroy({
      where: {
        id: id
      }
    })

    // 检查是否有记录被删除
    if (result === 0) {
      return res.status(404).json({ error: '没有找到需要删除的房源记录！' })
    }

    // 删除成功后返回响应
    res.status(200).json({
      title: '删除成功',
      message: '房源记录已被成功删除!',
      data: result
    })
  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 获取热门房源信息
const getHotProperty = async (req, res) => {
  try {
    // 获取页码和每页大小
    const { pageSize, page } = req.query

    // 确保页码和每页大小是有效的数字
    if (isNaN(parseInt(pageSize, 10)) || isNaN(parseInt(page, 10)) || pageSize < 0 || page < 0) {
      return res.status(400).json({ error: '无效的页码或每页大小' })
    }

    // 计算offset
    const offset = (parseInt(page, 10) - 1) * parseInt(pageSize, 10)

    const hotProperty = await PropertyModel.findAndCountAll({
      where: {
        is_hot: 1,
      },
      order: [
        ['updatedAt', 'DESC'],
        ['createdAt', 'DESC']
      ],
      offset: offset,
      limit: parseInt(pageSize, 10)
    })

    res.status(200).json({
      title: '热门房源信息',
      data: hotProperty
    })

  } catch (error) {
    res.status(500).json({ error: error.message })
  }

}

// 添加热门房源
const addHotProperty = async (req, res) => {
  try {
    // 获取房源ID
    const id = req.params.id

    if (!id) {
      return res.status(400).json({ error: '房源ID不能为空！' })
    }

    const hotProperty = await PropertyModel.findByPk(id)

    // 房源不存在的情况
    if (!hotProperty) {
      return res.status(400).json({ error: '房源不存在！' })
    }

    // 检查是否已经是热门房源
    if (hotProperty.is_hot) {
      return res.status(200).json({
        title: '已经是热门房源',
        message: '该房源已经是热门房源，无需再次添加！'
      })
    }

    // 更新房源为热门房源
    const updateHotProperty = await hotProperty.update({ is_hot: 1 })

    // 返回成功响应
    res.status(200).json({
      title: '添加成功',
      message: '房源已经被成功添加为热门房源！'
    })
  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 移除热门房源
const deleteHotProperty = async (req, res) => {
  try {
    // 获取房源ID
    const id = req.params.id

    if (!id) {
      return res.status(400).json({ error: '房源ID不能为空！' })
    }

    const hotProperty = await PropertyModel.findByPk(id)

    // 房源不存在的情况
    if (!hotProperty) {
      return res.status(400).json({ error: '房源不存在！' })
    }

    // 检查是否是热门房源
    if (!hotProperty.is_hot) {
      return res.status(200).json({
        title: '不是热门房源',
        message: '该房源不是热门房源，无需移除！'
      })
    }

    // 移除热门房源
    const updateHotProperty = await hotProperty.update({ is_hot: 0 })

    // 返回成功响应
    res.status(200).json({
      title: '移除成功',
      message: '该热门房源已经被移除！'
    })
  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 统计房源总数
const propertyTotal = async (req, res) => {
  try {
    const propertyCountValue = await PropertyModel.count()

    // 统计成功返回响应
    res.status(200).json({
      title: '房源总数',
      data: propertyCountValue
    })

  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 统计热门房源总数
const hotPropertyTotal = async (req, res) => {
  try {
    const hotPropertyCountValue = await PropertyModel.count({
      where: {
        is_hot: 1
      }
    })

    // 统计成功返回响应
    res.status(200).json({
      title: '热门房源总数',
      data: hotPropertyCountValue
    })

  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 房源列表搜索功能
const searchProperty = async (req, res) => {
  try {
    // 获取用户输入的搜索词
    const searchText = req.query.data

    // 如果搜索词为空返回空数组
    if (!searchText || searchText.trim() === '') {
      return res.status(200).json([])
    }

    // 搜索匹配内容
    const propertyItem = await PropertyModel.findAll({
      where: {
        [Op.or]: [
          { title: { [Op.like]: `%${searchText}%` } },
          { description: { [Op.like]: `%${searchText}%` } },
          { address: { [Op.like]: `%${searchText}%` } },
          { resident: { [Op.like]: `%${searchText}%` } },
          { county: { [Op.like]: `%${searchText}%` } },
          { city: { [Op.like]: `%${searchText}%` } },
          { province: { [Op.like]: `%${searchText}%` } },
          { room_type: { [Op.like]: `%${searchText}%` } },
          { decorate_type: { [Op.like]: `%${searchText}%` } },
          { rent_type: { [Op.like]: `%${searchText}%` } },
          { room_direction: { [Op.like]: `%${searchText}%` } },
        ]
      }
    })

    // 返回查询结果
    return res.status(200).json({
      title: '搜索成功',
      data: propertyItem
    })

  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 热门房源搜索功能
const searchHotProperty = async (req, res) => {
  try {
    // 获取用户输入的搜索词
    const searchText = req.query.data

    // 如果搜索词为空返回空数组
    if (!searchText || searchText.trim() === '') {
      return res.status(200).json([])
    }

    // 搜索匹配内容
    const hotPropertyItem = await PropertyModel.findAll({
      where: {
        is_hot: 1,
        [Op.or]: [
          { title: { [Op.like]: `%${searchText}%` } },
          { description: { [Op.like]: `%${searchText}%` } },
          { address: { [Op.like]: `%${searchText}%` } },
          { resident: { [Op.like]: `%${searchText}%` } },
          { county: { [Op.like]: `%${searchText}%` } },
          { city: { [Op.like]: `%${searchText}%` } },
          { province: { [Op.like]: `%${searchText}%` } },
          { room_type: { [Op.like]: `%${searchText}%` } },
          { decorate_type: { [Op.like]: `%${searchText}%` } },
          { rent_type: { [Op.like]: `%${searchText}%` } },
          { room_direction: { [Op.like]: `%${searchText}%` } },
        ]
      }
    })

    // 返回查询结果
    return res.status(200).json({
      title: '搜索成功',
      data: hotPropertyItem
    })

  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

module.exports = {
  getPropertyList,
  getPropertyDetail,
  uploadImage,
  publishProperty,
  deleteProperty,
  getHotProperty,
  addHotProperty,
  deleteHotProperty,
  propertyTotal,
  hotPropertyTotal,
  searchProperty,
  searchHotProperty
}